#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;

class Solution
{
public:
    static bool canFinish(int numCourses, vector<vector<int>>& prerequisites)
    {
        unordered_map<int, vector<int>> hash;//邻接表-存一个点后面连的结点
        vector<int> in(numCourses);//每个点的入度值
        //建表
        for(auto& e : prerequisites)
        {
            int a = e[0], b = e[1];
            hash[b].emplace_back(a);
            in[a]++;
        }

        queue<int> q;
        //所有度为0的点入队
        for(int i=0; i<numCourses; i++)
        {
            if(in[i]==0)
                q.emplace(i);
        }

        while(!q.empty())
        {
            int t = q.front();
            q.pop();
            for(int e : hash[t])
            {
                in[e]--;
                if(in[e]==0)
                    q.emplace(e);
            }
        }
        for(int e : in)
        {
            if(e)
                return false;
        }
        return true;
    }
};